package com.fiberhome.nas.core.util.time

import com.fiberhome.nas.core.util.time.DateTimeUtils.DATE_FORMAT
import com.fiberhome.nas.core.util.time.DateTimeUtils.DATE_TIME_FORMAT
import com.fiberhome.nas.core.util.time.DateTimeUtils.ISO_DATE_TIME_FORMAT
import com.fiberhome.nas.core.util.time.DateTimeUtils.TIME_FORMAT
import kotlinx.datetime.Instant
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Date
import java.util.Locale
import java.util.concurrent.TimeUnit

object DateTimeUtils {

    const val DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"
    const val DATE_FORMAT = "yyyy-MM-dd"
    const val TIME_FORMAT = "HH:mm:ss"
    const val ISO_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
}

/**
 * 日期格式化器 - 自定义模式
 */
fun Date.formatToCustomPattern(pattern: String): String {
    val localDateTime = this.toInstant()
        .atZone(ZoneId.systemDefault())
        .toLocalDateTime()
    val formatter = DateTimeFormatter.ofPattern(pattern, Locale.getDefault())
    return localDateTime.format(formatter)
}

/**
 * 日期格式化器 - 完整日期时间
 */
fun Date.formatToDateTime(): String {
    return formatToCustomPattern(DATE_TIME_FORMAT)
}

/**
 * 日期格式化器 - 仅日期
 */
fun Date.formatToDate(): String {
    return formatToCustomPattern(DATE_FORMAT)
}

/**
 * 日期格式化器 - 仅时间
 */
fun Date.formatToTime(): String {
    return formatToCustomPattern(TIME_FORMAT)
}

/**
 * 将ISO 8601格式的字符串转换为日期字符串
 * 输入为ISO 8601格式，输出为 yyyy-MM-dd 格式的日期字符串
 */
fun String.formatISOToDate(): String {
    val instant = Instant.parse(this) // 解析 ISO 字符串
    val localDate = instant.toLocalDateTime(TimeZone.currentSystemDefault()).date // 提取日期部分
    return localDate.toString() // 默认输出 yyyy-MM-dd
}

/**
 * 将Java Date对象转换为ISO 8601格式字符串
 * 格式为 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" (例如：2023-01-01T12:30:45.123Z)
 */
fun Date.formatToISO(): String {
    val formatter = DateTimeFormatter
        .ofPattern(ISO_DATE_TIME_FORMAT)
        .withZone(java.time.ZoneOffset.UTC)

    return formatter.format(this.toInstant())
}

/**
 * 将毫秒转换为时间字符串
 * 格式为 "HH:mm:ss" 或 "mm:ss"
 */
fun Long.formatToDuration(): String {
    val seconds = TimeUnit.MILLISECONDS.toSeconds(this)
    val hours = seconds / 3600
    val remainingSeconds = seconds % 3600
    val minutes = remainingSeconds / 60
    val secs = remainingSeconds % 60
    return if (hours > 0) {
        String.format(Locale.getDefault(), "%02d:%02d:%02d", hours, minutes, secs)
    } else {
        String.format(Locale.getDefault(), "%02d:%02d", minutes, secs)
    }
}


